#ifndef __CRC_H
#define __CRC_H

typedef enum
{
	CRC_8=0,
	CRC_8_ITU,
	CRC_8_ROHC,
	CRC_8_MAXIM,
	CRC_16_IBM=4,
	CRC_16_MAXIM,
	CRC_16_USB,
	CRC_16_MODBUS,
	CRC_16_CCITT,
	CRC_16_CCITT_FALSE,
	CRC_16_X25,
	CRC_16_XMODEM,
	CRC_16_XMODEM2,
	CRC_16_DNP,
	CRC_32=14,
	CRC_32_C,
	CRC_32_KOOPMAN,
	CRC_32_MPEG_2,
}CRCCRCType_TypeDef;//CRC类别枚举

typedef struct
{
	uint8_t Width;//宽度,建议8~32位
	uint64_t Poly;//多项式,长度比宽度大1
	uint8_t IOTurn;//输入输出是否反转,0-不反转,1-反转
	uint64_t Initial;//初始值,长度等于宽度
	uint64_t OUTXOR;//结果异或值,长度等于宽度
}CRC_CRCTypeDef;//CRC结构体

void CRC_StructureInit(CRC_CRCTypeDef *CRC_Structure,CRCCRCType_TypeDef CRC_Type);//CRC结构体初始化
void CRC_StructureCustomInit(CRC_CRCTypeDef *CRC_Structure,uint8_t Width,uint64_t Poly,uint8_t IOTurn,uint64_t Initial,uint64_t OUTXOR);//CRC结构体自定义初始化
void CRC_Calc(CRC_CRCTypeDef *CRC_Structure,uint8_t *Data,uint8_t Length,uint8_t *CRC_Result);//CRC计算

#endif
